環境: CentOS 6.9 套件: vsftpd , pam
原因:
在linux系統上說道FTP伺服器,大家都會很直覺的聯想到vsftpd。
vsftpd的預設登入帳號密碼會與我們linux系統上的進行串接;
所以很多時候你要開幾個帳號,你就得在系統上開幾個帳號。
其實這樣是非常危險的,
你只要稍不注意很可能就會讓某些帳號變成系統的大漏洞。
所以我們這邊要使用虛擬帳號來當給FTP作為登入使用。
處理方式:
1.下載相關套件
#yum install -y vsftpd
#yum install -y pam* db4*
#yum install libdb-utils (db_load使用)
2.vsftpd設定檔調整
#vim /etc/vsftpd/vsftpd.conf
(下面為設定內容)
=!================================================
#log 設定
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
#pam驗證的檔案是哪一隻(/etc/pam.d/vsftpd.virtual)
pam_service_name=vsftpd.virtual
#禁止匿名登入
anonymous_enable=NO
nopriv_user=vsftpd
local_enable=YES
#使用者權限
dirlist_enable=YES
download_enable=YES
write_enable=YES
local_umask=022
virtual_use_local_privs=YES
#變更家目錄路徑的相關設定
chroot_list_enable=YES
chroot_local_user=YES
chroot_list_file=/etc/vsftpd/chroot_list
#預設禁止登入的系統帳號
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
#虛擬帳號登入時,是使用哪個帳號做串接(vsftpd)
guest_enable=YES
guest_username=vsftpd
#虛擬帳號登入&預設的家目錄位置
($USER 是指登入後的帳號)
user_sub_token=$USER
local_root=/home/vsftpd/$USER
user_config_dir=/etc/vsftpd/userconf
#FTP顯示檔案的擁有者
hide_ids=YES
#系統設定
listen=YES
dirmessage_enable=YES
tcp_wrappers=YES
max_clients=200
max_login_fails=5
=!================================================
這邊是先建立帳號的清單
#vim /etc/vsftpd/virtual_users
清單格式(一行帳號;一行密碼,有多組帳號就依序填下去)
=!==================================
範例:
#ftpuser001account #帳號
#tpuser001passwd #密碼
#ftpuser002account #帳號
#ftpuser002passwd #密碼
user001
passwd001
…..
=!==================================
利用剛剛建立的清單建立.db的驗證登入檔案。
(這邊比較麻煩的是,如果要新增帳號,這個流程都要重做)
相較之下如果可以直接用mysql驗證登入會簡單許多。
#db_load -T -t hash -f /etc/vsftpd/virtual_users /etc/vsftpd/virtual_users.db
4.創建每個虛擬帳號的家目錄路徑&權限
#mkdir /etc/vsftpd/userconf
這個資料夾中,每一個帳號都是一個獨立檔案。
權限&家目錄都會在這裡設定。
(家目錄位置必須是實體帳號可以連結過去的位置)
#vim /etc/vsftpd/userconf/user001
=!=範例為唯讀的帳號權限============
#家目錄路徑位置
local_root=/home/volume01
#是否可以寫入檔案
write_enable=NO
#是否可以匿名上傳檔案
anon_upload_enable=NO
=!=================================
#touch /etc/vsftpd/chroot_list
一般來說我們會將使用者限制在我們給他的家目錄之下。
但是有時候會有些特殊帳號,要可以離開家目錄,
到他的上一層的路徑撈取一些檔案資料。
這時候我們就是chroot的時候。
一般來說我們會建立一個空檔。
當有特殊帳號要離開家目錄的需求時,
我們會在這個檔案裏面加入他的【帳號名稱】。
服務重啟後,他就可以自由地切換目錄路徑,
因為太自由對管理者來說是很危險的事,
所以當使用者使用完畢後,要即刻將帳號從chroot中移除。
6.設定登入驗證的選項
#cp -rf /etc/pam.d/vsftpd /etc/pam.d/vsftpd.virtual
原始檔我們保留不動。
#vim /etc/pam.d/vsftpd.virtua
在設定/etc/pam.d/vsftpd.virtua的時候,
千萬記住用不到的東西就直接註解調。
雖然這便設定應該是一個沒有對應到,會繼續往下找對應的登入方式。
但我當時真的是因為部分設定沒註解,
造成我虛擬帳號要登入時需多的異常問題。
#%PAM-1.0
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_users
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_users
這邊要特別說明,你建立好的.db檔案,
在pam裡面設定時不需要將.db帶入設定檔當中,
他會自己去相關路徑當中找尋對應的檔案。
這好像也是很多人在說,
當你的帳號設定檔產生完.db檔後,要將設定檔砍掉的原因。
因為當你有相同的檔名在同一個路徑下,不管後面是不是帶.db,
他好像都會去讀取,結果就會造成部分的錯誤。
7.創建實體帳號
#useradd vsftpd -G users -d /home/vsftpd -s /bin/false
這邊的實體帳號就是我們虛實串接的一個橋樑。
我們的虛擬帳號需要有一個實體帳號的串接才可以在系統中做存取的動作。
到這邊就差不多都設定完了。
可以重啟一下vsftpd看看有沒有甚麼問題。
#service vsftpd restart
試著用剛剛創建的虛擬帳號進行登入測試。
8.錯誤訊息查詢
如果登入發生錯誤,就要去檢查一下LOG檔,
這邊我們要查詢pam.d驗證部分,
登入失敗原因的時候要去看【/var/log/secure】
(基本上錯誤都不超過5行,當登入失敗時就馬上去看一下吧)
#tail –n 5 /var/log/secure
這邊會很清楚地跟你說相關的錯誤原因。
=!成功訊息==========================================
vsftpd[25807]: pam_userdb(vsftpd.virtual:auth): user 'user001' granted access
=!==================================================
=!失敗訊息==========================================
這邊明顯地說出你的帳號user001密碼驗證失敗,
失敗的原因就得去看pam.d那邊的設定是不是有誤,
才會無法正確的驗證密碼部分。
pam_succeed_if(vsftpd.virtual:auth): error retrieving information about user user001
pam_userdb(vsftpd.virtual:auth): user ' user001' granted access
pam_unix(vsftpd.virtual:auth): check pass; user unknown
=!=================================================
=!失敗訊息=========================================
這邊是說因為MD5的問題,造成我的密碼無法正確的驗證。
這個訊息是指在用mysql做帳號密碼驗證的時候才會出現的問題。
pam_succeed_if(vsftpd.virtual:auth): error retrieving information about user user001
pam_mysql - non-crypt()ish MD5 hash is not supported in this build.
pam_unix(vsftpd.virtual:auth): check pass; user unknown
=!===================================================
原本我也是要用mysql Service作為我帳密登入驗證。
但我的pam_mysql.so一直不支援md5,
重新在編譯的時候套用了openssl也是一樣的狀況,
暫時就先不考慮用mysql的方式做登入驗證。
所以就先改為現在的方式,之後會再研究看看。
9.備註
下面是如果要使用mysql做帳號登入驗證時會需要的套件。
(1)mysql
#yum install -y mysql mysql-server pam_mysql
(2)pam_mysql-0.7RC1.tar.gz (重點在md5加解密)
#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
#./configure --with-openssl=/usr --with-mysql=/usr
#make && make install
#ls /usr/lib/security | grep pam_mysql.so (檢查一下lib是否存在了)
(3)再來就是自己設計資料庫 & 在pam.d當中做些許設定的修改。
因為這部分我個人測試是失敗的狀況,
所以可能就請大家google尋找一些相關文件進行後續設定了。
10.附帶一提
我當初是為了要將外接式硬碟掛載到LINUX主機上,
提供外部使用者做連線使用,才會做到這個專題。
#mount -t ntfs-3g /dev/sdb1 /home/volume01
透過系統掛載上來的外接式硬碟的權限是777
也就是不管誰都可以直接存取。
而掛載點也必須有點留心,
要放在你的實體帳號可以過去的路徑。
(例如我建的帳號vsftpd,家目錄/home/vsftpd,有權限連到/home路徑下)
如果放錯路徑,不管你的權限是不是777,
在你的實體帳號要連過去那個資料夾之前就已經先被阻擋了。
所以這也是我把外接式硬碟掛載在/home目錄下的原因。
上面的方法只是臨時掛載,要開機啟用時就掛載,
當然還是要寫到/etc/fstab當中。
#vim /etc/fstab
=!格式==============================================
/dev/sdb1 /home/volume01 ntfs-3g defaults 0 0
=!==================================================
修改完可以試著掛載看看。
#mount -a
發現掛載失敗,要馬上先把剛才的設定拿掉,檢查有甚麼問題。
如果不處理,你下次重開機就會發現因為硬碟掛載的問題,你開不了機。
11.參考網址
http://www.kuqin.com/article/50vpn/1321601.html
(本篇完)